#!/usr/bin/python
# -*- coding:utf-8 -*-
# @author  : 龍皓
# @time    : 2024/12/18 17:41
# @function: 定时任务工具类
# @version : 1.0.0

from apscheduler.schedulers.background import BackgroundScheduler
import time

class TaskUtil:
    def __init__(self):
        # 创建后台执行的调度器
        self.scheduler = BackgroundScheduler()
        self.scheduler.start()

    def add_task(self, func, task_type='cron', **task_kwargs):
        """
        添加定时任务

        :param func: 要执行的函数
        :param task_type: 定时任务类型，可选值为 'cron'（按cron表达式执行）、'interval'（按固定间隔执行），默认为 'cron'
        :param task_kwargs: 传递给定时任务配置的关键字参数，用于设置具体的时间规则等
        """
        try:
            if task_type == 'cron':
                self.scheduler.add_job(func, 'cron', **task_kwargs)
            elif task_type == 'interval':
                self.scheduler.add_job(func, 'interval', **task_kwargs)
            else:
                raise ValueError("不支持的任务类型")
        except Exception as e:
            print(f"添加定时任务出现异常: {e}")

    def keep_run(self):
        """
        保持程序运行，使定时任务能够按计划执行

        Returns:
        """
        try:
            # 保持主程序运行，使得定时任务可以按计划执行
            while True:
                # 每隔六十秒暂停一下，避免占用过多系统资源
                time.sleep(60)
                pass
        except (KeyboardInterrupt, SystemExit):
            self.shutdown()
        except Exception as e:
            print(f"程序运行过程中出现异常: {e}")

    def shutdown(self):
        """
        关闭调度器，用于结束所有定时任务并清理资源
        """
        try:
            self.scheduler.shutdown()
        except Exception as e:
            print(f"关闭调度器出现异常: {e}")

def get_task():
    """获取定时任务实例"""
    return TaskUtil()